package com.zp.qualitypractice.Utils;

import android.app.Fragment;
import android.app.Notification;
import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.PixelFormat;
import android.graphics.drawable.ColorDrawable;
import android.graphics.drawable.Drawable;
import android.net.Uri;
import android.support.annotation.DrawableRes;
import android.support.annotation.Nullable;
import android.widget.ImageView;
import android.widget.RemoteViews;

import com.bumptech.glide.RequestBuilder;
import com.bumptech.glide.load.DataSource;
import com.bumptech.glide.load.engine.GlideException;
import com.bumptech.glide.load.resource.bitmap.BitmapTransitionOptions;
import com.bumptech.glide.load.resource.bitmap.RoundedCorners;
import com.bumptech.glide.load.resource.drawable.DrawableTransitionOptions;
import com.bumptech.glide.request.RequestListener;
import com.bumptech.glide.request.RequestOptions;
import com.bumptech.glide.request.target.NotificationTarget;
import com.bumptech.glide.request.target.Target;
import com.zp.qualitypractice.io.GlideApp;
import com.zp.qualitypractice.R;

import java.io.ByteArrayOutputStream;
import java.io.File;

/**
 * Created by izp on 2017/6/25.
 */

public class PicUtils {
    /**
     * @param drawable 传入drawable，不过需要有固定宽高，color类Drawable会有问题
     * @return  位图
     */
    public static Bitmap drawable2Bitmap(Drawable drawable){
        Bitmap bitmap = Bitmap.createBitmap(//调用静态create方法，
                        drawable.getIntrinsicWidth(),//传入固有宽高
                        drawable.getIntrinsicHeight(),//这里对没有固有宽高的drawable就有点无力了，比如color等
                        drawable.getOpacity() != PixelFormat.OPAQUE ? Bitmap.Config.ARGB_8888
                                //获取透明度，如果透明，用32位色值，如果不透明用8位色值。
                                : Bitmap.Config.RGB_565);
        Canvas canvas = new Canvas(bitmap);//创建一个画布，传入刚才只有轮廓和色值的bitmap
        //canvas.setBitmap(bitmap);
//        给drawable色值轮廓大小。这里的意思是，在画布的左上角（0，0）绘制除drawable固有大小的宽高
        drawable.setBounds(0, 0, drawable.getIntrinsicWidth(), drawable.getIntrinsicHeight());
        drawable.draw(canvas);//将drawable绘制到canvas上，canvas将根据传入的drawable对bitmap做处理，然后得到的bitmap就是我们需要的bitmap
        return bitmap;
    }

    /**
     * @param context 上下文
     * @param res 资源id
     * @return 用BitmapFactory可以字节转换
     */
    public static Bitmap res2Bitmap(Context context,@DrawableRes int res){
        return BitmapFactory.decodeResource(context.getResources(), res);
    }

    /**
     * @param bitmap 位图
     * @return 返回字节数组，不可能为null，但是可能为[]，这里格式和质量需要按需调整
     */
    public static byte[] bitmap2Bytes(Bitmap bitmap){
        ByteArrayOutputStream baos = new ByteArrayOutputStream();
        bitmap.compress(Bitmap.CompressFormat.PNG, 100, baos);
        return baos.toByteArray();
    }

    /**
     * 传入
     * @param bytes 字节数组
     * @return 返回Bitmap
     */
    public static Bitmap bytes2Bimap(byte[] bytes){
        if(bytes.length!=0){
//            用BitmapFactory可以从0到尾，对传入的字节数组进行转换
            return BitmapFactory.decodeByteArray(bytes, 0, bytes.length);
        } else {
            return null;
        }
    }

    public static void displayImage(Context context, String imageUrl, ImageView imageView){
        GlideApp.with(context)
                .load(imageUrl)
                .into(imageView);
    }
    public static void getRequestBuilder(Context context,String url,ImageView imageView){
        RequestBuilder requestBuilder = GlideApp.with(context).load(url);
//添加加载的监听
        requestBuilder.listener(new RequestListener() {//这里没有指定泛型，所以有个警告
            @Override
            public boolean onLoadFailed(@Nullable GlideException e, Object model, Target target, boolean
                    isFirstResource) {
                return false;
            }

            @Override
            public boolean onResourceReady(Object resource, Object model, Target target, DataSource dataSource, boolean isFirstResource) {
                return false;
            }
        });
//缩略图
        requestBuilder.thumbnail(0.5f);
//加载图片的url
        requestBuilder.load("IMAGE_URL");
//加载到的imageview对象
        requestBuilder.into(imageView);

    }

    private static RequestOptions getRequestOptions() {

        RequestOptions options = new RequestOptions();
        //options.format(DecodeFormat.PREFER_ARGB_8888)
        //options.centerCrop()//图片显示类型
        //options.placeholder(loadingRes)//加载中图片
        //options.error(errorRes)//加载错误的图片
        options.error(new ColorDrawable(Color.RED));//或者是个颜色值
        //options.priority(Priority.HIGH)//设置请求优先级
        //options.diskCacheStrategy(DiskCacheStrategy.ALL);
        //options.diskCacheStrategy(DiskCacheStrategy.RESOURCE)//仅缓存原图片
        //options.diskCacheStrategy(DiskCacheStrategy.ALL)//全部缓存
        //options.diskCacheStrategy(DiskCacheStrategy.AUTOMATIC)缓存缩略过的
        //options.onlyRetrieveFromCache(true)//仅从缓存加载
        //options.skipMemoryCache(true)//禁用缓存,包括内存和磁盘
        //options.diskCacheStrategy(DiskCacheStrategy.NONE)仅跳过磁盘缓存
        //options.override(200,200)加载固定大小的图片
        //options.dontTransform()不做渐入渐出的转换
        //options.transition(new DrawableTransitionOptions().dontTransition())//同上
        //options.circleCrop()设置成圆形头像<这个是V4.0新增的>
        //options.transform(new RoundedCorners(10))设置成圆角头像<这个是V4.0新增的>

        return options;
    }

    /**
     * @param context
     * 吧reqestBulder和option解耦出来，是为了更好的配置解耦。但是平常使用还是链式的
     */
    public static void useOption(Context context){
        GlideApp.with(context)
                .asBitmap()
                .load("http://url")
                .apply(getRequestOptions());//使用自定义的配置
    }
    public static void loadImage(Context context,String url,ImageView imageView){
        GlideApp.with(context)
                .asBitmap()
                .load(url)
                .placeholder(R.drawable.ic_menu_camera)
                .error(R.drawable.ic_menu_manage)
//                .thumbnail(Glide.with(this)
//                        .load(ImageConfig.URL_JPEG))可以用它加载另外一个地址上的小图片作为缩略图
                //.skipMemoryCache(false)
                //.dontTransform()
                .centerCrop()
                //.diskCacheStrategy(DiskCacheStrategy.ALL)
                //.priority(Priority.HIGH)//设置请求优先级
                //这个是设置渐显的效果
                .transform(new RoundedCorners(8))
                .transition(new BitmapTransitionOptions().crossFade(200))//前面如果不使用asBitmap，后面就不能使用一些Bitmap转换
                .into(imageView);
    }

    /**
     * 加载圆形头像
     *
     * @param context 如果是activity glide会与其生命周期关联,在onStop()中取消加载图片,如果
     *                想要始终加载图片则需要传入Application实例
     * @param url
     * @param target
     */
    public static void loadRoundImg(Context context, String url, ImageView target) {

        //https://github.com/wasabeef/glide-transformations--glide转换库
        GlideApp.with(context)
                .load(url)
                .placeholder(R.drawable.ic_menu_send)
                .error(R.drawable.ic_menu_gallery)
                .circleCrop()//直接在链式中调用就行哦
                .transition(new DrawableTransitionOptions().crossFade(1000))//渐显效果
                .into(target);
    }
    /**
     * 加载圆角图片
     *
     * @param context 如果是activity glide会与其生命周期关联,在onStop()中取消加载图片,如果
     *                想要始终加载图片则需要传入Application实例
     * @param url
     * @param target
     */
    public static void loadRoundedCornersImg(Context context, String url, ImageView target) {

        GlideApp.with(context)
//                .asBitmap()
                .load(url)
                .placeholder(R.drawable.ic_menu_send)
                .error(R.drawable.ic_menu_gallery)
                .transform(new RoundedCorners(40))
                .transition(new DrawableTransitionOptions().crossFade(200))//渐显效果
//                如果不使用asBitmap这个的话，下面就要用DrawableTransitionOptions(),并且和asBitmap不兼容
                .into(target);
    }

    /**
     * 加载原图片
     *
     * @param c
     * @param url
     * @param target
     */
    public static void loadSourceImg(Context c, String url, ImageView target) {
        GlideApp.with(c)
                .load(url)
                .transition(new DrawableTransitionOptions().crossFade(200))
                .centerCrop()
                //.sizeMultiplier(0.5f)//如果原图过大那么使用这个
                .into(target);
    }
    /**
     * 根据资源ID加载图片
     *
     * @param c
     * @param resourceId
     * @param target
     * @param defaultId
     */
    public static void loadResourseImg(Context c, int resourceId, ImageView target, int defaultId) {
        GlideApp.with(c)
                .load(resourceId)
                .placeholder(defaultId)
                .transition(new DrawableTransitionOptions().crossFade(200))
                .centerCrop()
                .into(target);
    }

    /**
     * 根据图片路径加载图片
     *
     * @param c
     * @param imgFile
     * @param target
     * @param defaultId
     */
    public static void loadFileImg(Context c, File imgFile, ImageView target, int defaultId) {
        GlideApp.with(c)
                .load(imgFile)
                .placeholder(defaultId)
                .transition(new DrawableTransitionOptions().crossFade(200))
                .centerCrop()
                .into(target);
    }

    /**
     * 加载Gif为一张静态图片
     *
     * @param context
     * @param url
     */
    public static void LoadGiftAsBitmap(Context context, String url, ImageView imageView) {
        GlideApp.with(context).asBitmap().load(url).into(imageView);
    }

    /**
     * 你想只有加载对象是Gif时才能加载成功
     *
     * @param context
     * @param url
     */
    public static void LoadGiftAsGist(Context context, String url, ImageView imageView, int erroId) {
        GlideApp.with(context).asGif().load(url).error(erroId).into(imageView);

        //只加载一次gift图时调用
        //        GlideApp.with(context).load(url)
        //                .diskCacheStrategy(DiskCacheStrategy.SOURCE)
        //                .into(new GlideDrawableImageViewTarget(imageView,1));
    }

    /**
     * 加载缩略图,会自动与传入的fragment绑定生命周期,加载请求现在会自动在onStop中暂停在，onStart中重新开始。
     * 需要保证 ScaleType 的设置是正确的。
     *
     * @param fragment
     * @param url
     * @param imageView
     */
    public static void LoadThumbNail(Fragment fragment, String url, ImageView imageView) {
        GlideApp.with(fragment).load(url).thumbnail(0.1f).into(imageView);
    }

    /**
     * 显示本地视频(网络视频无效)
     *
     * @param context
     * @param filePath
     * @param imageView
     */
    public static void LoadShowLocalVidio(Context context, String filePath, ImageView imageView) {
        GlideApp.with(context).load(Uri.fromFile(new File(filePath))).into(imageView);
    }

    /**
     * 在通知栏中显示从网络上请求的图片
     *
     * @param context
     * @param remoteViews
     * @param viewId
     * @param notification
     * @param notificationId
     * @param url
     */
    public static void ShowImgInNotification(Context context, RemoteViews remoteViews, int viewId, Notification
            notification, int notificationId, String url) {
        NotificationTarget target = new NotificationTarget(context, viewId, remoteViews, notification, notificationId);
        GlideApp.with(context.getApplicationContext()).asBitmap().load(url).into(target);
    }
    /**
     * 下载图片,耗时操作不能放在主线程中进行
     *
     * @param context
     * @param url
     */
    public static void downLoadImage(Context context, String url) {

        try {
            GlideApp.with(context).asBitmap().load(url).centerCrop().listener(new RequestListener<Bitmap>() {
                @Override
                public boolean onLoadFailed(@Nullable GlideException e, Object model, Target<Bitmap> target, boolean
                        isFirstResource) {
                    return false;
                }

                @Override
                public boolean onResourceReady(Bitmap resource, Object model, Target<Bitmap> target, DataSource
                        dataSource, boolean isFirstResource) {
                    return false;
                }
            }).submit().get();
        } catch (Exception e) {
            e.printStackTrace();
        }


    }

    /**
     * 清除缓存
     *
     * @param context
     */
    public void clearCache(final Context context) {
        clearMemoryCache(context);
        new Thread(new Runnable() {
            @Override
            public void run() {
                clearDiskCache(context);
            }
        }).start();
    }
    /**
     * 清除内存缓存
     *
     * @param context
     */
    public void clearMemoryCache(Context context) {
        GlideApp.get(context).clearMemory();
    }

    /**
     * 清除磁盘缓存
     *
     * @param context
     */
    public void clearDiskCache(Context context) {
        GlideApp.get(context).clearDiskCache();
    }

}
